namespace study6_02 {

    // Pick 选择
    // 从类型定义T的属性中，选取指定一组属性，返回一个新的类型定义

    // 源码
    type Pick<T, K extends keyof T> = {
        [P in K]: T[P]
    }

    type Person = {
        name: string,
        age: number,
        text: string
        address: string
    }

    type Ex = 'text' | 'age'

    type A = Pick<Person, Ex>


    // 转换后选中的部分为新的类型定义
    // type A = {
    //     text: string;
    //     age: number;
    // }

    let a: A = {
        age: 12,
        text: 'asd'
    }
    console.log(a);



    // 示例
    type Person2 = {
        name: string,
        age: number,
        text: string
        address: string
    }


    // 要求1：使用pick抽取"text" | "age"属性，并且使用交叉类型新增e属性
    // 要求2：让新类型的属性变成可选
    type B = Partial<Pick<Person2, "text" | "age"> & {
        e: string
    }>
    let obj: B = {
        age: 123,
        e: 'as',
        text: 'ad'
    }

    // 转换后的类型
    // type B = {
    //     text?: string | undefined;
    //     age?: number | undefined;
    //     e?: string | undefined;
    // }

    let b: B = {
        age: 45,
        e: 'as',
        text: 'sasd'
    }
    console.log(b);


}